/**
 * @file circuit_config.c
 * @author Linquan  
 * @brief   
 *          根据需求进行修改。
 *          提供回路ID与回路类型转换函数、
 *          提供回路节点模块操作函数获取。
 * 
 * @version 1.0
 * @date 2024-08-17
 * 
 * @copyright Copyright (c) 2024
 * 
 */
#include "circuit_config.h"
#include "circuit_node_collection.h"



typedef struct{
    circuit_node_type_t   type;
    node_operate_irf_t*  op_irf;
}operat_irf_t;

#define     NODE_OP_IRF(type)  {type, &OP_FUNC_IRF(type)}

operat_irf_t node_op_irf_table[] = {
  
    NODE_OP_IRF(TYPE_SENSOR_07A_SLAVE),
    NODE_OP_IRF(TYPE_CTR_CW1320_91A),
    NODE_OP_IRF(TYPE_MOD_RELAY),
    NODE_OP_IRF(TYPE_SENSOR_07A_SLAVE),
    NODE_OP_IRF(TYPE_SENSOR_CO),
    NODE_OP_IRF(TYPE_SENSOR_H2),
    NODE_OP_IRF(TYPE_SENSOR_SMOKE),
    NODE_OP_IRF(TYPE_SENSOR_TEMPERATURE),

    /** 其余的接口函数还没实现，等实现了再打开注释 */
    // NODE_OP_IRF(TYPE_EXTI_PRESS),
    // NODE_OP_IRF(TYPE_PROTECT_ZONE),
    

};





/**
 * @brief Get the op irf by circuit node type object
 *          通过节点类型，获得对应的操作函数
 * @param type 
 * @return node_operate_irf_t* 
 */
node_operate_irf_t*   get_op_irf_by_circuit_node_type(circuit_node_type_t type)
{
    node_operate_irf_t *op_ptr = NULL;

     for (int i = 0; i < ARRY_SIZE(node_op_irf_table); i++) {
        if (type == node_op_irf_table[i].type) {
            op_ptr = node_op_irf_table[i].op_irf;
            break;
        }
    }
    return op_ptr;
}




/**
 * @brief Get the circuit kind object
 *  根据回路ID来获得真实回路的端口类型
 * @param id 
 * @return really_circuit_kind_t : 当不满足回路ID要求，返回 KIND_ERR
 */
really_circuit_kind_t get_circuit_kind(self_circuit_ID_t id)
{
    really_circuit_kind_t  circuit_kind;
    switch (id)
    {
        case SELF_CIRCUIT_CAN_IN1:
        case SELF_CIRCUIT_CAN_OUT1:

            circuit_kind = KIND_CAN_PROT;       
        break;
    
        case SELF_CIRCUIT_RS485_IN1:
        case SELF_CIRCUIT_RS485_OUT1:

            circuit_kind = KIND_RS485_PROT;       
        break;

            /**> TODO： 这些回路目前不用，先注释掉 */
//        case SELF_CIRCUIT_DRY_POINT:
//            circuit_kind = KIND_DRY_POINT;
//        break;
//        case SELF_CIRCUIT_ETH0:
//        case SELF_CIRCUIT_ETH1:
//            circuit_kind = KIND_ETH_PORT;
//        break;

    default:
            circuit_kind = KIND_ERR; 
        break;
    }
}

